package com.monkeyboy.utils;

import java.io.*;

/**
 * 描述: 处理文件的帮助类 作者: 高嘉银 时间:2018年3月27日 下午2:12:32
 */
public class FileHelper {

	/**
	 * 作用: 创建一个文件 作者:高嘉银 时间:2018年3月27日 下午4:10:06
	 * 
	 * @param path
	 * @param InputStream
	 * @return
	 * @throws Exception
	 */
	public static boolean createFile(InputStream stream, String path, String filename) throws Exception {
		checkPath(path);// 检查路径是否存在
		BufferedInputStream bin = null;
		BufferedOutputStream bout = null;
		try {
			// 得到输入流缓冲对象
			bin = new BufferedInputStream(stream);
			// 得到输出流对象
			bout = new BufferedOutputStream(new FileOutputStream(new File(path + "/" + filename)));
			// 开始读取源文件
			// 设置一个缓冲区
			byte[] buff = new byte[stream.available()];
			while (bin.read(buff) != -1) {
				bout.write(buff);
			}
			bout.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				bin.close();
				bout.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return true;
	}

	/**
	 * 作用: 字符流创建文件 作者:gjy 时间:2018年3月27日 下午5:06:52
	 * 
	 * @param stream
	 * @param charset
	 * @param path
	 * @param filename
	 * @param isAppead
	 *            是否追加内容
	 * @return
	 * @throws Exception
	 */
	public static boolean createFileForChar(InputStream stream, String charset, String path, String filename,
			boolean isAppend) throws Exception {
		checkPath(path);
		BufferedReader br = null;
		BufferedWriter bw = null;
		try {
			// 得到一个输入缓冲字符流对象
			br = new BufferedReader(new InputStreamReader(stream, charset));
			// 得到一个输出缓冲字符流对象
			bw = new BufferedWriter(
					new OutputStreamWriter(new FileOutputStream(path + "/" + filename, isAppend), "utf-8"));
			String line = null;
			while ((line = br.readLine()) != null) {
				if (line == "" && line.length() == 0) {
					bw.newLine();
				} else {
					bw.write(line);
					bw.newLine();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();

		} finally {
			try {
				br.close();
				bw.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return true;
	}

	/**
	 * 作用: 判断文件夹位置是否存在，不存在就进行创建 作者:gjy 时间:2018年3月27日 下午2:40:47
	 * 
	 * @param path
	 * @return
	 */
	public static void checkPath(String path) throws Exception {
		if (path == null || path == "" || path.length() == 0) {
			throw new RuntimeException("文件找不到！");
		}
		File f = new File(path);
		if (!f.exists()) {
			f.mkdirs();
		}
	}

	/**
	 * 作用： 获取一个输入流对象，主要是用于图片的输出 作者：高嘉银 时间：2018年4月5日
	 * 
	 * @param path
	 * @param fileName
	 * @return
	 * @throws FileNotFoundException
	 */
	public static InputStream getStream(String path, String fileName) throws Exception {
		File f = new File(path + "/" + fileName);
		if (!f.exists()) {
			// 如果没有找到文件就抛出一个文件没有找到的异常
			throw new FileNotFoundException();
		} else {
			return new FileInputStream(f);
		}
	}

	/**
	 * 作用： 删除临时文件夹中的某个文件 作者：高嘉银 时间：2018年4月5日
	 * 
	 * @param path
	 * @param fileName
	 */
	public static void deleteTempFile(String path, String fileName) {
		File f = new File(path + "/" + fileName);
		if (f.exists()) {
			f.delete();
		}
	}

	/**
	 * 作用： 删除upload里面的文件
	 * 
	 * @Author:Gavin
	 * @time:2018年7月16日
	 * @param path
	 * @param fileName
	 */
	public static void deleteUploadFile(String path, String fileName) {
		File f = new File(path + "/" + fileName);
		if (f.exists()) {
			f.delete();
		}
	}

	/**
	 * 作用： 把文件从临时文件夹转到永久的文件夹里面 作者：高嘉银 时间：2018年4月5日
	 * 
	 * @param form
	 * @param to
	 * @param fileName
	 * @return
	 * @throws IOException
	 */
	public static boolean transforTempFileToUploadFile(String from, String to, String fileName) {
		boolean ret = false;
		File fromF = new File(from + "/" + fileName);
		File toF = new File(to + "/" + fileName);
		InputStream in = null;
		OutputStream out = null;
		if (!fromF.exists()) {
			return false;
		} else if (toF.exists()) {
			return true;
		} else {
			if (!new File(to).exists()) {
				new File(to).mkdirs();
			}
			try {
				out = new FileOutputStream(toF);
				in = new FileInputStream(fromF);
				byte[] buff = new byte[in.available()];
				in.read(buff);
				out.write(buff);
				if (new File(to + "/" + fileName).exists()) {
					ret = true;
				}
			} catch (FileNotFoundException e) {
				e.printStackTrace();
				ret = false;
			} catch (Exception e) {
				e.printStackTrace();
				ret = false;
			} finally {
				try {
					if (in != null)
						in.close();
					if (out != null)
						out.close();
				} catch (IOException e) {
					e.printStackTrace();
					ret = false;
				}
			}
		}
		return ret;
	}

	/**
	 * 作用： 复制一个文件为另一个文件
	 * 
	 * @Author:Gavin
	 * @time:2018年8月28日
	 * @param originFile
	 * @param newFilePath
	 * @param newFileName
	 * @return
	 */
	public static boolean copyFile(String originFile, String newFilePath, String newFileName) {
		boolean flag = true;
		FileInputStream in = null;
		FileOutputStream out = null;
		try {
			File f = new File(originFile);
			if (!f.exists()) {
				flag = false;
				return flag;
			}
			checkPath(newFilePath);
			in = new FileInputStream(f);
			out = new FileOutputStream(new File(newFilePath + "/" + newFileName));
			if(in.available()>0) {
				byte[] buff = new byte[in.available()];
				in.read(buff);
				out.write(buff);
			}else {
				flag=false;
			}
		}catch(FileNotFoundException e) {
			flag=false;
		} catch (Exception e) {
			flag = false;
		} finally {
			try {
				if (in != null)
					in.close();
				if (out != null)
					out.close();
			} catch (IOException e) {
				flag=false;
			}

		}
		return flag;
	}

	public static void main(String[] args) throws Exception {
		String originFile = "D:/file/temp/2b8e80981ff349e1b8769a343b5342c5.png";
		String newFilePath = "D:/file/temp";
		System.out.println(copyFile(originFile, newFilePath, "123.jpg"));
	}
}
